﻿using mozhi.smarterp.BasicData.ExpenseItems.Repositories;
using mozhi.smarterp.BasicData.ExpenseItems.Services;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;

namespace mozhi.smarterp.BasicData.ExpenseItems
{
    public class ExpenseItemAppService : BasicDataAppService, IExpenseItemAppService
    {
        private IExpenseItemRepository _repository;
        private ExpenseItemManager _manager;

        public ExpenseItemAppService(IExpenseItemRepository repository , ExpenseItemManager manager)
        {
            _repository = repository;
            _manager = manager;
        }

        public async Task<ExpenseItemDto> CreateAsync(ExpenseItemCreateDto input)
        {
            var expenseItem = await _manager.GetAysnc(null , input.Code , input.Name , input.Type , input.Activated);

            expenseItem = await _repository.InsertAsync(expenseItem);

            return ObjectMapper.Map<ExpenseItem, ExpenseItemDto>(expenseItem);
        }

        public async Task DeleteAsync(Guid id)
        {
            var expenseItem = await _repository.GetAsync(id);

            if (expenseItem == null)
                throw new UserFriendlyException($"费用项目：{id}不存在", "100000");

            await _repository.DeleteAsync(id);
        }

        public async Task<ExpenseItemDto> GetAsync(Guid id)
        {
            var expenseItem = await _repository.GetAsync(id);

            if (expenseItem == null)
                throw new UserFriendlyException($"费用项目：{id}不存在", "100000");

            return ObjectMapper.Map<ExpenseItem, ExpenseItemDto>(expenseItem);
        }

        public async Task<PagedResultDto<ExpenseItemDto>> GetListAsync(ExpenseItemResultRequestDto filter)
        {
            var expenseItems = await _repository.GetPagedListAsync(filter.Keyword, filter.Activated, filter.Type, filter.SkipCount, filter.MaxResultCount, filter.Sorting);

            var count = await _repository.GetCountAsync(filter.Keyword, filter.Activated, filter.Type);

            var result = new PagedResultDto<ExpenseItemDto>();

            result.Items = ObjectMapper.Map<List<ExpenseItem>, List<ExpenseItemDto>>(expenseItems);
            result.TotalCount = count;

            return result;
        }

        public async Task<ExpenseItemDto> UpdateAsync(ExpenseItemUpdateDto input)
        {
            var expenseItem = await _manager.GetAysnc(input.Id, input.Code, input.Name, input.Type, input.Activated);

            expenseItem = await _repository.UpdateAsync(expenseItem);

            return ObjectMapper.Map<ExpenseItem, ExpenseItemDto>(expenseItem);
        }
    }
}
